//  接口是一个用来限制对象形状的工具
// interface type 都是ts中的关键字
interface IObj {
  name: string,
  age: number,
  sex: number,
  qq?: string, // 可有可无
  [qqwwwereee: string]: any  // 上述四个属性是受限制的 其他的属性可有可无 之没有任何限制
}

let obj: IObj = {
  name: "zhufeng ",
  age: 13,
  sex: 1,
  yy: 78,
  uu: true
}
obj.age = 99
obj.qq = '345'


interface IObj1 {
  qq: string
}
interface IObj1 {
  ww: string,
  f(a: string, b: string): string
}

let obj2: IObj1 = {
  qq: '',
  ww: '',
  f(q, y) {
    return ''
  }
}
obj2.f('1', '2')


interface Iobj3 extends IObj1 {
  tt: number
}
// let obj3: Iobj3 = {

// }

// 泛型 可以理解成一个 类型 变量
function createAry<QQQ>(length: number, value: QQQ): QQQ[] {
  let ary = []
  for (let i = 0; i < length; i++) {
    if (i % 2) {
      ary[i] = value
    } else {
      // ary[i] = '111'
    }

  }
  return ary
}

createAry<boolean>(5, true)
createAry<string>(5, 'true')
createAry<number>(5, 2)

interface IUser<T> {
  <QQQQ>(x: T, y: T): QQQQ
}


// let f5: IUser = function <Q>(a: Q, b: Q): Q {
//   return a
// } 
let f6: IUser<number> = function <Q>(a: number, b: number): Q {
  return ('' as any)
}

f6<boolean>(1, 2)
export { }